from typing import List, Any

import pydash


class CircleQueue:
    """
    数据管理队列

    Args:
        __data: 数据存储数组
        __current: 当前数据指针位置

    """

    def __init__(self):
        self.__data: List[Any] = []  # 存储数据
        self.__current = 0  # 指示当前位置

    def put(self, data: Any):
        """
        追加一个数据到数组

        Args:
            data: 需要修改的数据
        """
        self.__data.append(data)

    def puts(self, data: List[Any]):
        for d in data:
            self.put(d)

    def get(self):
        if pydash.is_empty(self.__data):
            return None

        _data_size = len(self.__data)
        out = self.__data[self.__current]
        self.__current = (self.__current + 1) % _data_size
        return out

    def gets(self, size: int):

        if pydash.is_empty(self.__data):
            return []

        # 一次最多
        _data_size = len(self.__data)
        if size > _data_size:
            size = _data_size

        # 默认一次不能全部取完
        _index = size + self.__current
        if _index > _data_size:
            # 数据循环拼接
            out = pydash.arrays.concat(self.__data[self.__current:], self.__data[0: _index % _data_size])

        else:
            out = self.__data[self.__current:self.__current + size]

        # 计算头指针的位置
        self.__current = (self.__current + size) % _data_size

        return out
